<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="div1"></div>
</body>
<script type='text/javascript' src="js/lib_0_2.js" ></script>
<script type='text/javascript'>
var trace=HE.trace;
(function(x){
	$E=function(id){
		if(typeof id=='object')return id;
		return document.getElementById(id);
		};
	$C=function(tagname){return document.createElement(tagname);};
	addEvent = function(elm, func, evType, useCapture) {
		var _el = typeof elm == 'string' ?$E(elm) : elm;
		if(_el == null){
			trace("addEvent 找不到对象：" + elm);return;
		}
		if (typeof useCapture == 'undefined') {
			useCapture = false;
		}
		if (typeof evType == 'undefined') {
			evType = 'click';
		}
		if (_el.addEventListener) {
			_el.addEventListener(evType, func, useCapture);
			return true;
		}
		else if (_el.attachEvent) {
			var r = _el.attachEvent('on' + evType, func);
			return true;
		}
		else {
			_el['on' + evType] = func;
		}
	};
	removeEvent = function (oElement, fHandler, sName) {
		var _el = $E(oElement);
		if(_el == null){
			trace("removeEvent 找不到对象：" + oElement);return;
		}
		if (typeof fHandler != "function") {
			return;
		}
		if (typeof sName == 'undefined') {
			sName = 'click';
		}
		if (_el.addEventListener) {
			_el.removeEventListener(sName, fHandler, false);
		}
		else if (_el.attachEvent) {
			_el.detachEvent("on" + sName, fHandler);
		}
		fHandler[sName] = null;
	};
	bindFunc = function(fFunc, object) { 
		var __method = fFunc; 
		return function() { 
			return __method.apply(object, arguments); 
		};
	};
	
	x['IjaxLoader'] = {
			/**
			 * 保存缓冲的任务列表
			 */
			arrTaskLists : [],
			/**
			 * 创建 iframe 节点用于载入数据，因为支持双线程，同时建立两个，减少 DOM 操作次数
			 */
			createLoadingIframe: function () {
				if(this.loadFrames != null){
					return false;
				}
				/**
				 * 生成随机 ID 来保证提交到当前页面的数据交互 iframe
				 * L.Ming | liming1@staff.sina.com.cn 2009-01-11
				 */
				var rndId1 = "loadingIframe_thread" + Math.ceil(Math.random() * 10000);
				var rndId2 = "loadingIframe_thread" + Math.ceil((Math.random() + 1) * 10000);
				this.loadFrames = [rndId1, rndId2];
			    var html = '<iframe id="' + rndId1 +'" name="' + rndId1 +'""\
			              scrolling="no" src=""\
			              allowTransparency="true" style="display:none;" frameborder="0"\
			              ><\/iframe>\
						  <iframe id="' + rndId2 +'" name="' + rndId2 +'" \
			              scrolling="no" src=""\
			              allowTransparency="true" style="display:none;" frameborder="0"\
			              ><\/iframe>';
			    //Sina.dom.addHTML(document.body, html); 临时替换
				var oIjaxIframeCnt = $C("div");
				oIjaxIframeCnt.id = "ijax_iframes";
				oIjaxIframeCnt.innerHTML = html;
				trace("创建 Ijax 需要的 iframe");
				document.body.appendChild(oIjaxIframeCnt);
				// 记录两个 iframe 加载器，默认是空闲状态
				var loadTimer = setInterval(bindFunc(function(){
					if($E(this.loadFrames[0]) != null && $E(this.loadFrames[1]) != null){
						clearInterval(loadTimer);
						loadTimer = null;
						this.loadingIframe = {
							"thread1" : {
								"container" : $E(this.loadFrames[0]),
								"isBusy" : false
							},
							"thread2" : {
								"container" : $E(this.loadFrames[1]),
								"isBusy" : false
							}
						};		
						this.loadByList();
					}
				}, this), 10);
			},
			/**
			 * 判断是否可以开始加载数据，必须是两个 iframe 节点可用的情况下
			 */
			isIjaxReady: function () {
				if(typeof this.loadingIframe == "undefined"){
//					trace("this.loadingIframe 暂时不存在");
					return false;
				}
				for(var oLoadCnt in this.loadingIframe){
					if(this.loadingIframe[oLoadCnt].isBusy == false){
//						trace("加载器空闲...");
						this.loadingIframe[oLoadCnt].isBusy = true;
						return this.loadingIframe[oLoadCnt];
					}
				}
//				trace("加载器繁忙...");
				return false;			
			},
			/**
			 * 处理请求参数接收
			 * 
			 * @param url 必选参数。请求数据的URL，是一个 URL 字符串，不支持数组
			 * @param option 可选参数 {
			 *  onComplete  : Function (Array responsedData),
			 *  onException : Function ();
			 *  GET : {}, 通过 GET 提交的数据
			 *  POST : {} 通过 POST 提交的数据
			 * }
			 */
			request: function (url, option) {
				var oTask = {};
				oTask.url = url;
				oTask.option = option || {};
				this.arrTaskLists.push(oTask);
//				trace("数据列表：" + this.arrTaskLists.length);
				if(this.loadFrames == null){
					this.createLoadingIframe();
				}
				else{
					this.loadByList();
				}		
			},
			/**
			 * 缓冲列表管理
			 */
			loadByList: function () {
				// 如果等待列表为空，则终止加载
				if (this.arrTaskLists.length == 0) {
					// 重新建立 iframe
					return false;
				}
				// 取得两个加载器的状态，看是否有空闲的
				var loadStatus = this.isIjaxReady();
				if(loadStatus == false){
					return false;
				}
//				trace("加载开始...");	
				var newData = this.arrTaskLists[0];
				this.loadData(newData.url, newData.option, loadStatus);
				// 删除列表第一条
				this.arrTaskLists.shift();			
			},
			/**
			 * 加载单条数据
			 */
			loadData: function (url, option, loader) {
				if (option.GET) {
					for(var key in option.GET){
						url=HE.setPara(url,key,option.GET[key]);
					}					
				}		
				url=HE.setPara(url,'rand',Math.random());
				// 当前用于加载数据的 iframe 对象
				var ifm = loader.container;
				ifm.listener = bindFunc(function () {
					try{
						var iframeObject = ifm.contentWindow.document, sResult;
						sResult = iframeObject.body.innerHTML;
						if(option.onComplete){
							option.onComplete(sResult);
						}
						else{
							option.onException();
						}
					}
					catch(e){
						traceError(e);
						if(option.onException){
							option.onException(e.message, url.toString());
						}
					}
					loader.isBusy = false;
					removeEvent(ifm, ifm.listener, "load");
					this.loadByList();
				},this);
				addEvent(ifm, ifm.listener, "load");
				
				try{
					window.frames(ifm.id).location.href = url;
				}catch(e){
					ifm.src = url;
				};			
				
			}
		};
})(window)

var count=0;

var inttv=setInterval(function(){
	IjaxLoader.request("test3.php", {
		onComplete : function(resultText) {
			HE.trace(resultText);
			count++;
			trace(count);
			HE.$('#div1').innerHTML=HE.$('#div1').innerHTML+"|"+count;
		},
		onException: function() {
			trace(count);
			HE.$('#div1').innerHTML=HE.$('#div1').innerHTML+"|"+count;
		}
	})
	
	if(count>100)clearInterval(inttv);
},10);

</script>
</html>